"use client"; import { useEffect, useState, use } from "react"; import { getFirestore, doc, getDoc, addDoc, collection, serverTimestamp, query, where, getDocs, } from "firebase/firestore"; import { Card, CardBody, Divider, Tabs, Tab, Button, Spinner, Accordion, AccordionItem, Input, RadioGroup, Radio, addToast, } from "@heroui/react"; import { Link } from "@heroui/link"; import { motion, AnimatePresence } from "framer-motion"; import { fontCursive, fontSans, fontMono } from "@/config/fonts"; import firebaseApp from "@/config/firebase"; import { MapPinIcon, CalendarIcon, ClockIcon, CheckIcon } from "@/components/icons"; export default function InvitationPage({ params, }: { params: Promise<{ slug: string }>; }) { const { slug } = use(params); const [guest, setGuest] = useState(null); const [loading, setLoading] = useState(true); const [notFound, setNotFound] = useState(false); const [isTranslating, setIsTranslating] = useState(false); const [translatedData, setTranslatedData] = useState(null); // RSVP States const [showRSVP, setShowRSVP] = useState(false); const [rsvpData, setRsvpData] = useState({ attending: "yes", guests: 1, food: "non-veg", note: "", captcha: "", }); const [rsvpLoading, setRsvpLoading] = useState(false); const [hasRSVPed, setHasRSVPed] = useState(false); const [hasEmailReminder, setHasEmailReminder] = useState(false); const handleRSVP = async () => { if (rsvpData.captcha.trim() !== "10") { addToast({ title: "Security Check", description: "Please answer correctly (Hint: 10).", color: "warning", }); return; } setRsvpLoading(true); try { const db = getFirestore(firebaseApp()); await addDoc(collection(db, "rsvps"), { guestId: slug, guestName: guest.name, ...rsvpData, timestamp: serverTimestamp(), }); setHasRSVPed(true); addToast({ title: "RSVP Received", description: "Thank you for confirming!", color: "success", }); } catch (err) { console.error("RSVP error", err); addToast({ title: "Error", description: "Failed to send RSVP. Please try again.", color: "danger", }); } finally { setRsvpLoading(false); } }; const translateContent = async () => { if (translatedData) { setTranslatedData(null); return; } if (!guest) return; setIsTranslating(true); try { // Simulate network delay for effect await new Promise((resolve) => setTimeout(resolve, 600)); const relationMap: Record = { family: "আত্মীয়", friend: "বন্ধু", colleague: "সহকর্মী", other: "শুভাকাঙ্ক্ষী", }; setTranslatedData({ guestName: guest.name || "অতিথি", familySide: guest.familySide, relation: relationMap[guest.relation?.toLowerCase()] || guest.relation || "শুভাকাঙ্ক্ষী", }); } catch (error) { console.error("Translation error:", error); addToast({ title: "অনুবাদ ব্যর্থ হয়েছে", description: "দুঃখিত, অনুবাদ করার সময় একটি সমস্যা হয়েছে।", color: "danger", }); setTranslatedData(null); } finally { setIsTranslating(false); } }; useEffect(() => { const fetchData = async () => { try { const db = getFirestore(firebaseApp()); const docRef = doc(db, "invitation", slug); const docSnap = await getDoc(docRef); if (docSnap.exists()) { const guestData = docSnap.data(); setGuest(guestData); // Check for existing email reminders const remindersQuery = query( collection(db, "email-reminders"), where("guestId", "==", slug), ); const remindersSnap = await getDocs(remindersQuery); if (!remindersSnap.empty) { setHasEmailReminder(true); } } else { setNotFound(true); } } catch (error) { console.error("Fetch error:", error); setNotFound(true); } finally { setLoading(false); } }; if (slug) fetchData(); }, [slug]); const events: any = { registration: { title: translatedData ? "শুভ আংটি বদল" : "Engagement Ceremony", date: translatedData ? "২৩শে নভেম্বর, ২০২৫" : "23rd November 2025", venue: translatedData ? "শ্রীরামপুর" : "Srerampore", map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d229.96354422747754!2d88.34617843336005!3d22.749911773448982!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89b1ee7f14647%3A0xe44dfacd65bb5f48!2sMohan%20Joyti%20Banquet%20Hall!5e0!3m2!1sen!2sin!4v1758679491438!5m2!1sen!2sin", mapHref: "https://maps.app.goo.gl/diSeycey1hyqqtAu8", time: translatedData ? "সকাল ১০:০০টা" : "10:00 AM", direction: translatedData ? "বটতলার কাছে" : "Near Battala", }, wedding: { title: translatedData ? "শুভ বিবাহ" : "Wedding Ceremony", date: translatedData ? "২৩শে জানুয়ারি, ২০২৬" : "23rd January 2026", venue: translatedData ? "শ্রীরামপুর" : "Serampore", map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3679.3779465759876!2d88.33077587399126!3d22.75135112639763!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89b287ddfb39b%3A0xc67348083f7cea9d!2sAnandamayee%20Bhawan!5e0!3m2!1sen!2sin!4v1765848206729!5m2!1sen!2sin", mapHref: "https://maps.app.goo.gl/G5R3bkcTwwa2d54R8", time: translatedData ? "সন্ধ্যা ০৬:০০টা" : "06:00 PM", direction: translatedData ? "বেলটিং বাজারের কাছে" : "Near Belting Bazar", }, reception: { title: translatedData ? "প্রীতিভোজ" : "Reception Celebration", date: translatedData ? "২৫শে জানুয়ারি, ২০২৬" : "25th January 2026", venue: translatedData ? "কোন্নগর" : "Konnagar", map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3680.8284397695707!2d88.35295167398938!3d22.697429628386114!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89c85a91d38fd%3A0x19dcd2c61895f79f!2sKonnagar%20Friends%20Union%20Club%20Community%20Centre%2FGangadhar%20Chatterjee%20Bhaban!5e0!3m2!1sen!2sin!4v1765848530552!5m2!1sen!2sin", mapHref: "https://maps.app.goo.gl/ubdTsy6tnYMsvSSXA", time: translatedData ? "সন্ধ্যা ০৬:০০টা" : "06:00 PM", direction: translatedData ? "জি.টি. রোডের কাছে" : "Near GT Road", }, }; const renderEventDetails = (event: any) => (
{/* Details */}

Date

{event.date}

Time

{event.time}

Venue

{event.venue}

{event.direction}

{/* Map Embed */}